package com.spsa.mensajeria.util;

import java.io.IOException;
import java.util.Hashtable;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.ibm.mq.MQC;
import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.spsa.persistencia.entidades.EstadoInterfaz;
import com.spsa.utilidades.Parametros;

public class ConexionMQ {
	static final Logger logger = LogManager.getLogger(ConexionMQ.class.getName());

	private static ConexionMQ conexionMQ = new ConexionMQ();
	private MQQueueManager queueManager;
	private MQQueue queue;
	
	private ConexionMQ() {
		
		intentarConectar();
	}
	
	public static ConexionMQ getInstance() {
		return conexionMQ;
	}
	
	public void intentarConectar() {
		cerrarConexionesPrevias();
				
		Hashtable props = new Hashtable();
		props.put(MQC.HOST_NAME_PROPERTY, Parametros.get("ConexionMQ.HOST")); //$NON-NLS-1$
		props.put(MQC.CHANNEL_PROPERTY, Parametros.get("ConexionMQ.CANAL")); //$NON-NLS-1$
		props.put(MQC.PORT_PROPERTY, Integer.parseInt(Parametros.get("ConexionMQ.PUERTO"))); //$NON-NLS-1$

		try {
			queueManager = new MQQueueManager(Parametros.get("ConexionMQ.GESTOR_COLA"), props); //$NON-NLS-1$
			queue = queueManager.accessQueue(Parametros.get("ConexionMQ.COLA"), MQC.MQOO_OUTPUT); //$NON-NLS-1$
			logger.info("Se conecto a la cola"); //$NON-NLS-1$
		}
		catch(MQException e) {
			logger.error("No se pudo conectar al servidor de la COLA", e); //$NON-NLS-1$
		}
	}

	private void cerrarConexionesPrevias() {
		try {
			if(queue != null)
				queue.close();
			if(queueManager != null)
				queueManager.close();
		}
		catch(MQException e) {
			logger.error("No se pudo cerrar las conexiones a la cola", e); //$NON-NLS-1$
		}
	}

	public void enviarMensaje(EstadoInterfaz estadoInterfaz) throws IOException, MQException{
		MQPutMessageOptions pmo = new MQPutMessageOptions();
		MQMessage message = new MQMessage();

		message.writeObject(estadoInterfaz);
		queue.put(message, pmo);
	}
}
